#ifndef HASH_H
#define HASH_H

#include <stdlib.h>
#include <stdbool.h>

typedef struct hash hash_t;

typedef struct hash_iter hash_iter_t;

typedef void (*hash_destruir_dato_t)(void*);

/**************** FUNCIONES HASH *****************************/
/* Crea una tabla de hash */
//	POST: Devuelve una tabla de hash creada
hash_t *hash_crear(hash_destruir_dato_t destruir_dato);

/* Guarda en el hash un par de clave/valor */
//	PRE: El hash fue creado
//	POST: Devuelve true si pudo guardar el par clave/valor,
//	sino devuelve false. Si la clave ya existia, reemplaza el dato
bool hash_guardar(hash_t *hash, const char *clave, void *dato);

/**/
void *hash_borrar(hash_t *hash, const char *clave);

/**/
void *hash_obtener(const hash_t *hash, const char *clave);

/**/
bool hash_pertenece(const hash_t *hash, const char *clave);

/**/
size_t hash_cantidad(const hash_t *hash);

/**/
void hash_destruir(hash_t *hash);

/**************** FIN FUNCIONES HASH ************************/


/**************** FUNCIONES DEL ITERADOR ********************/

/**/
hash_iter_t *hash_iter_crear(const hash_t *hash);

/**/
bool hash_iter_avanzar(hash_iter_t *iter);

/**/
const char *hash_iter_ver_actual(const hash_iter_t *iter);

/**/
bool hash_iter_al_final(const hash_iter_t *iter);

/**/
void hash_iter_destruir(hash_iter_t* iter);

/**************** FIN FUNCIONES DEL ITERADOR *****************/


#endif // HASH_H
